#include "data.hpp"
#include "hot.hpp"
#include "server.hpp"
#include <thread>
void FileUtilTest(const std::string &filename)
{
    // cloud::FileUtil fu(filename);
    // std::cout << fu.FileSize() << std::endl;
    // std::cout << fu.LastATime() << std::endl;
    // std::cout << fu.LastMTime() << std::endl;
    // std::cout << fu.FileName() << std::endl;
    // 3个函数测试
    // std::string body;
    // fu.GetPosLen(&body, 1, 3);
    // fu.GetContent(&body);
    // std::cout << body;
    // body += " hql";
    // fu.SetContent(&body);
    // 写入测试
    // std::string body = "nihaoa!";
    // fu.SetContent(&body);
    // cloud::FileUtil fu(filename);
    // std::string packed = "hello.zip";
    // std::cout << fu.Compress(packed);
    // cloud::FileUtil pfu(packed);
    // std::cout << pfu.UnCompress("./hello.txt");

    cloud::FileUtil fu(filename);
    fu.CreateDirectory();
    std::vector<std::string> v;
    fu.ScanDirectory(&v);
    for(auto &e : v) {
        std::cout << e << std::endl;
    }
    
}
void JsonUtilTest()
{
    const char *name = "小明";
    int age = 22;
    int id = 1;
    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    root["学号"] = id;
    std::string res;
    bool ret = cloud::JsonUtil::Serialize(root, &res);
    std::cout << ret << "\n" <<  res << std::endl;

    Json::Value root2;
    bool ret2 = cloud::JsonUtil::UnSerialize(res, &root2);
    std::cout << ret2 << std::endl;
    std::cout << root["姓名"].asString() << std::endl;
    std::cout << root["年龄"].asInt() << std::endl;
    std::cout << root["学号"].asInt() << std::endl;

    
}

void DataTest(const std::string &filename)
{
    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);
    

    // cloud::DataManager dm;
    // dm.Insert(info);
    // cloud::BackupInfo tmp;

    // std::cout << "--------GetOneByURL-------" << std::endl;

    // dm.GetOneByURL("/download/bundle.h", &tmp);
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.realpath << std::endl;
    // std::cout << tmp.url << std::endl;
    // std::cout << tmp.packpath << std::endl;

    // std::cout << "--------GetOneByRealPath-------" << std::endl;

    // dm.GetOneByRealPath(filename, &tmp);
    // std::cout << tmp.pack_flag << std::endl;
    // std::cout << tmp.fsize << std::endl;
    // std::cout << tmp.atime << std::endl;
    // std::cout << tmp.mtime << std::endl;
    // std::cout << tmp.realpath << std::endl;
    // std::cout << tmp.url << std::endl;
    // std::cout << tmp.packpath << std::endl;

    // std::cout << "--------GetAll-------" << std::endl;


    // std::vector<cloud::BackupInfo> arry;
    // dm.GetAll(&arry);
    // for(auto &tmp : arry) {
    //     std::cout << tmp.pack_flag << std::endl;
    //     std::cout << tmp.fsize << std::endl;
    //     std::cout << tmp.atime << std::endl;
    //     std::cout << tmp.mtime << std::endl;
    //     std::cout << tmp.realpath << std::endl;
    //     std::cout << tmp.url << std::endl;
    //     std::cout << tmp.packpath << std::endl;
    // }
 
    // dm.Update(info);
    
    cloud::DataManager dm;

    std::vector<cloud::BackupInfo> arry;
    dm.GetAll(&arry);
    for(auto &tmp : arry) {
        std::cout << tmp.pack_flag << std::endl;
        std::cout << tmp.fsize << std::endl;
        std::cout << tmp.atime << std::endl;
        std::cout << tmp.mtime << std::endl;
        std::cout << tmp.realpath << std::endl;
        std::cout << tmp.url << std::endl;
        std::cout << tmp.packpath << std::endl;
    }
}
cloud::DataManager *_data;
void HotTest()
{
    cloud::HotManager hot;
    hot.RunModule();
}
void ServiceTest()
{
    cloud::Service svr;
    svr.RunModule();
}
int main(int argc, char **argv)
{
    // if(argc < 2) 
    // {
    //     std::cout << "Usage : ./cloud <filename>" << std::endl;
    //     return -1;
    // }
    _data = new cloud::DataManager();

    
    //FileUtilTest(argv[1]);
    //JsonUtilTest();
    //DataTest(argv[1]);
    //HotTest();
    //ServiceTest();
    std::thread t1(HotTest);
    std::thread t2(ServiceTest);
    t1.join();
    t2.join();


    return 0;
}